#pragma once
#include <string.h>
#include <sstream>
#include <fstream>
#include "Exceptions.h"
#include "Linha.h"
#include "graphviewer.h"
#include "Graph.h"

using namespace std;

/**
 * \class Metro
 *
 * \brief Classe Metro contem a configuracao do metro.
 * O metro possui uma linha com varias estacoes e o grafo correspondente.
 * Contem tambem a indicacao do algoritmo a utilizar.
 * 
 * \authors Carla Abreu, Diogo Silva, Luis Fonseca
 *
 * \version 1.0
 *
 * \date 2011/04/11 15:10:00 $
 *
 */
class Metro {
private:
	vector< Linha > linhas;

	int indexDaEstacao(const char* nome);

public:
	enum Algoritmos { DIJKSTRA, BELLMANFORD, FLOYDWARSHALL };
	Algoritmos algoritmo;
	unsigned int nEstacoes;
	vector<Estacao *> estacoes;
	Graph<string> myGraph;

	/**
	 * Construtor da Classe Metro.
	 * @param string  nomeConfig O nome do ficheiro de configuracao.
	 * @param *GraphViewer  gv Apontador para a janela GraphViewer.
	 */
	Metro(string nomeConfig, GraphViewer *gv);
	
	/**
	 * Construtor da Classe Metro.
	 */
	Metro();

	/**
	 * Destrutor da Classe Metro.
	 */
	virtual ~Metro();
	/**
	 * Carrega o ficheiro de configuracao.
	 * @param string  nomeConfig O nome do ficheiro de configuracao.
	 * @param *GraphViewer  gv Apontador para a janela GraphViewer.
	 * \throw IOError
	 * \throw MetroConfigMalformed
	 */
	void carregaConfiguracao(string nomeConfig, GraphViewer *gv);
	
	/**
	 * Construtor da Classe Metro.
	 * @param string  nomeConfig O nome do ficheiro de configuracao.
	 * @param *GraphViewer  gv Apontador para a janela GraphViewer.
	 * @param bool  actualizarViewer Demarcar o caminho mais curto na janela do GraphViewer.
	 * \throw MetroEstacaoNaoExistente
	 */
	void menorCaminho(const string estacaoOrigem, const string estacaoDestino, GraphViewer *gv);
};
